package br.com.cedente.http;

import java.io.IOException;
import java.util.Arrays;

import br.com.cedente.log.RegistroDeLog;
import br.com.sicoob.cedente.transacao.ComunicacaoException;
import br.com.sicoob.cedente.transacao.NegocioException;
import br.com.sicoob.cedente.transacao.ResourceLoader;
import br.com.sicoob.cedente.transacao.Transacao;
import br.com.sicoob.cedente.transacao.TransacaoFactory;
import br.com.sicoob.model.IndiceDeDados;
import br.com.sicoob.model.Mensagem;


/**
 * @author wesley.araujo
 *
 */
public class ValidaAmbienteTransacao {

	private String enderecoSRTB;
    private String portaSRTB;
    private String terminal;
    private String sequencialTerminal;
    private String codigoCanal;
    private String numeroPac;
    private String idProduto;
    private String cooperativa; 
    private String cliente;
    private int tempoMaxEntreTentativas;
    private int quantidadeTentativas;
    private int timeout;
    
    
    private RegistroDeLog setLog = RegistroDeLog.getInstance(ValidadorAmbienteIntegrado.class.getName());
        
    public ValidaAmbienteTransacao() {
    	initConstantes();
	}

    
    private void initConstantes() {
    	
    	// centralizando dados iniciais para a transacao.
    	ResourceLoader.setPath("relatorios/");
    	cooperativa = IndiceDeDados.COOPERATIVA.getValor();
        cliente = IndiceDeDados.CLIENTE.getValor();
        enderecoSRTB = IndiceDeDados.ENDERECO_SRTB.getValor();
        portaSRTB = IndiceDeDados.PORTASRTB.getValor();
        terminal = IndiceDeDados.TERMINAL.getValor();
        sequencialTerminal = IndiceDeDados.SERQUENCIAL.getValor();
        codigoCanal = IndiceDeDados.CODIGOCANAL.getValor();
        numeroPac = IndiceDeDados.PAC.getValor();
        idProduto = IndiceDeDados.PRODUTO.getValor();
        quantidadeTentativas = new Integer(IndiceDeDados.QUANTIDADETENTATIVAS.getValor());
        tempoMaxEntreTentativas = new Integer(IndiceDeDados.TEMPO_ENTRE_TENTATIVAS.getValor());
        timeout = new Integer(IndiceDeDados.TIMEOUT.getValor());
                
    }

    
    public boolean testaTransacao(){
    	boolean retorno = false;
		try {
			Transacao tr = criaTransacao();
			Mensagem msg = executaTransacao(tr);
			
	    	if(msg.next()){
	    		setLog.info(IndiceDeDados.OK_TRANSACAO.getValor());
	    		setLog.info(IndiceDeDados.OK_TRANSACAO);
	    		retorno = true;  		    		
	    	}
	    	
		} catch (NegocioException e) {
			setLog.severe(IndiceDeDados.ERRO_ERROVALIDACAODADOS);
			setLog.severe(e.getMessage());
		} catch (ComunicacaoException e) {
			setLog.severe(IndiceDeDados.ERRO_CONN);
			setLog.severe(e.getMessage());
		} catch (IOException e) {
			setLog.severe(IndiceDeDados.ERRO_IO);
			setLog.severe(e.getMessage());

		}
    	  return retorno;  	    	
    }
    
    private Mensagem executaTransacao(Transacao transacaoInclusao) throws ComunicacaoException, NegocioException, IOException {

        Mensagem mensagem = transacaoInclusao.executarPesquisa();
        if (mensagem.possuiErro()) {
            throw new IllegalStateException(Arrays.toString(mensagem.getMsgErro()));
        }
        return mensagem;

    }

    private Transacao criaTransacao() throws NegocioException, ComunicacaoException, IOException {

        Transacao transacao = TransacaoFactory.getTransacao("CONSBANCCOR", cooperativa, cliente, enderecoSRTB, portaSRTB,
                sequencialTerminal, numeroPac, codigoCanal, terminal, idProduto, quantidadeTentativas, tempoMaxEntreTentativas, timeout);

        transacao.prepararMensagem();
        return transacao;
    }

}
